package main

import (
	"fmt"
)

type Animal2 interface {
	eat()
	sleep()
}
type Dog4 struct {
	name string
}

func (dog Dog4) eat() {
	fmt.Println(dog.name + "eat")
}
func (dog Dog4) sleep() {
	fmt.Println(dog.name + "sleep")
}

func test1(a Animal2) {
	fmt.Println("test1")
	a.eat() //当调用这个方法时，传入的对象是实现类的对象，那么eat方法中a就是那个对象
}

func main() {
	dog := Dog4{"大黄"}
	dog.sleep()
	dog.eat()

	//当一个实现类实现了接口中的所有方法
	//那么所有传入接口的地方那也就可以传入实现类
	test1(dog)

	//定义一个类型为接口的变量
	//实际上可以赋值为任意实现类的对象
	var animal Animal2
	animal = dog
	fmt.Println(animal)
	//这时候只能使用animal的方法，不能使用dog的属性
	animal.sleep()
	animal.eat()
}
